% \iffalse meta-comment
%
% Copyright (C) 2009-2017 by weijianwen <weijianwen@gmail.com>
%           (C) 2018-2019 by SJTUG
%
% This file may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3c
% of this license or (at your option) any later version.
% The latest version of this license is in
%    https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
% version 2005/12/01 or later.
%
% This file has the LPPL maintenance status "maintained".
%
% The Current Maintainer of this work is Alexara Wu.
%
%<*internal>
\begingroup
  \def\nameoflatex{LaTeX2e}
\expandafter\endgroup\ifx\nameoflatex\fmtname\else
\csname fi\endcsname
%</internal>
%<*install>
\input docstrip.tex
\keepsilent
\askforoverwritefalse

\preamble

Copyright (C) 2009-2017 by weijianwen <weijianwen@gmail.com>
          (C) 2018-\the\year by SJTUG

This file may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either version 1.3c
of this license or (at your option) any later version.
The latest version of this license is in
    https://www.latex-project.org/lppl.txt
and version 1.3c or later is part of all distributions of LaTeX
version 2005/12/01 or later.

This file has the LPPL maintenance status "maintained".

The Current Maintainer of this work is Alexara Wu.

\endpreamble

\generate{
  \usedir{tex/latex/sjtuthesis}
    \file{\jobname.cls}         {\from{\jobname.dtx}{class}}
    \file{\jobname-bachelor.ltx}{\from{\jobname.dtx}{bachelor}}
    \file{\jobname-graduate.ltx}{\from{\jobname.dtx}{graduate}}
    \file{sjtudoc.cls}          {\from{\jobname.dtx}{document}}
%</install>
%<*internal>
  \usedir{source/latex/sjtuthesis}
    \file{\jobname.ins}         {\from{\jobname.dtx}{install}}
%</internal>
%<*install>
}

\Msg{* Happy TeXing!}

\endbatchfile
%</install>
%<*internal>
\fi
%</internal>
%<*driver>
\ProvidesFile{sjtuthesis.dtx}
%</driver>
%<class|document>\NeedsTeXFormat{LaTeX2e}
%<class>\ProvidesClass{sjtuthesis}
%<document>\ProvidesClass{sjtudoc}
%<bachelor>\ProvidesFile{sjtuthesis-bachelor.ltx}
%<graduate>\ProvidesFile{sjtuthesis-graduate.ltx}
%<*(class|bachelor|graduate|document)>
  [2019/06/16 1.0.0rc Shanghai Jiao Tong University Thesis Template]
%</(class|bachelor|graduate|document)>
%<*(document|class)>
\hyphenation{SJTU-Thesis}
\def\sjtuthesis{SJTU\textsc{Thesis}}
\def\version{1.0.0rc}
%</(document|class)>
%<*driver>
\documentclass{sjtudoc}
\EnableCrossrefs
\CodelineIndex
\RecordChanges
% \OnlyDescription
\begin{document}
  \DocInput{\jobname.dtx}
  \clearpage
  \PrintChanges
  \clearpage
  \PrintIndex
\end{document}
%</driver>
% \fi
%
% \DoNotIndex{\def,\long,\edef,\xdef,\gdef,\let,\global}
% \DoNotIndex{\if,\ifnum,\ifdim,\ifcat,\ifmmode,\ifvmode,\ifhmode,%
%             \iftrue,\iffalse,\ifvoid,\ifx,\ifeof,\ifcase,\else,\or,\fi}
% \DoNotIndex{\begin,\end,\bgroup,\egroup,\begingroup,\endgroup}
% \DoNotIndex{\expandafter,\csname,\endcsname}
% \DoNotIndex{\hsize,\vsize,\hskip,\vskip,\kern,\hfil,\hfill,\hss}
% \DoNotIndex{\hspace,\vspace}
% \DoNotIndex{\p@,\m@ne,\z@,\@ne,\tw@,\@plus,\@minus}
% \DoNotIndex{\newcounter,\setcounter,\addtocounter,}
% \DoNotIndex{\newdim,\newlength,\setlength,\addtolength}
% \DoNotIndex{\newcommand,\renewcommand,\providecommand,\DeclareRobustCommand}
% \DoNotIndex{\newenvironment,\renewenvironment}
% \DoNotIndex{\RequirePackage,\LoadClass,\ProvidesClass}
% \DoNotIndex{\DeclareOption,\CurrentOption,\ExecuteOptions,\ProcessOptions}
% \DoNotIndex{\rmfamily,\sffamily,\ttfamily,\bfseries,\mdseries,\itshape,%
%             \textrm,\textsf,\texttt,\textbf,\textmd,\textit,\textsl,\textsc}
% \DoNotIndex{\iint,\iiint,\iiiint,\oint,\oiint,\oiiint,%
%             \intclockwise,\varointclockwise,\ointctrclockwise,\sumint,%
%             \intbar,\intBar,\fint,\cirfnint,\awint,\rppolint,%
%             \scpolint,\npolint,\pointint,\sqint,\intlarhk,\intx,%
%             \intcap,\intcup,\upint,\lowint}
% \DoNotIndex{\a,\b,\c,\d,\e,\f,\g,\h,\i,\j,\k,\l,%
%             \m,\n,\o,\p,\q,\r,\s,\t,\u,\v,\w,\x,\y,\z,%
%             \A,\B,\C,\D,\E,\F,\G,\H,\I,\J,\K,\L,%
%             \M,\N,\O,\P,\Q,\R,\S,\T,\U,\V,\W,\X,\Y,\Z,%
%             \do\#,\$,\%,\&,\@,\\,\{,\},\^,\_,\~,\ ,\,,\!,\',\",\/,\*,\-}
% \DoNotIndex{\quad,\par,\relax,\ccwd}
% \DoNotIndex{\bp@}
%
% \GetFileInfo{\jobname.dtx}
%
% \changes{v0.10}{2018/01/09}{项目转移至 \href{https://github.com/sjtug/SJTUThesis}{SJTUG} 名下，并增加了英文模版，修改了默认字体设置。}
% \changes{v0.9.5}{2017/01/27}{改用 GB/7714-2015 参考文献风格。}
% \changes{v0.9.4}{2016/08/25}{增加算法和流程图。}
% \changes{v0.9}{2015/06/19}{适配 \pkg{ctex} 2.x 宏包，需要使用 TeXLive 2015 编译。}
% \changes{v0.8}{2015/03/15}{使用 \pkg{biber}/\pkg{biblatex} 组合替代 \BibTeX，带来更强大稳定的参考文献处理能力；添加 \pkg{enumitem} 宏包增强列表环境控制能力；完善宏包文字描述。}
% \changes{v0.7}{2015/02/15}{增加盲审选项，调用外部工具插入扫描件。}
% \changes{v0.6.5}{2015/02/14}{修正一些小问题，缩减 git 仓库体积，仓库由 sjtu-thesis-template-latex 更名为 \sjtuthesis。}
% \changes{v0.6}{2014/12/17}{学士、硕士、博士学位论文模板合并在了一起。}
% \changes{v0.5.3}{2013/05/26}{更正 \env{subsubsection} 格式错误，这个错误导致如“1.1 小结”这样的标题没有被正确加粗。}
% \changes{v0.5.2}{2012/12/27}{更正拼写错误。在 \file{diss.tex} 加入 \file{ack.tex}。}
% \changes{v0.5.1}{2012/12/21}{在 \LaTeX\ 命令和中文字符之间留了空格，在 \file{Makefile} 中增加 release 功能。}
% \changes{v0.5}{2012/12/05}{修改说明文件的措辞，更正 \file{Makefile} 文件，使用 \pkg{metalog} 宏包替换 \pkg{xltxtra} 宏包，使用 \pkg{mathtools} 宏包替换 \pkg{amsmath} 宏包，移除了所有 CJKtilde 符号。}
% \changes{v0.4}{2012/05/30}{包含交大学士、硕士、博士学位论文模板。模板在 \href{https://github.com/weijianwen/SJTUThesis}{GitHub} 上管理和更新。}
% \changes{v0.3a}{2010/12/05}{移植到 \XeTeX/\LaTeX 上。}
% \changes{v0.2a}{2009/12/25}{模板由 \cls{CASthesis} 改名为 \cls{sjtumaster}。在 \file{diss.tex} 中可以方便地改变正文字号、切换但双面打印。增加了不编号的一章“全文总结”。添加了可伸缩符号（等号、箭头）的例子，增加了长标题换行的例子。}
% \changes{v0.1c}{2009/11/20}{增加了 Linux 下使用 \pkg{ctex} 宏包的注意事项、\file{bib} 条目的规范要求，修正了 \pkg{ctexbook} 与 \pkg{listings} 共同使用时的断页错误。}
% \changes{v0.1b}{2009/11/13}{完善了模板使用说明，增加了定理环境、并列子图、三线表格的例子。}
% \changes{v0.1a}{2009/11/12}{上海交通大学硕士学位论文 \LaTeX\ 模板发布。}
%
% \title{\bfseries\color{sjtublue}\sjtuthesis：上海交通大学学位论文模板}
% \author{\href{https://sjtug.org/}{SJTUG}}
% \date{\filedate\qquad v\fileversion}
%
% \maketitle
% \thispagestyle{empty}
% \vspace{\stretch{1}}
% \begin{center}
%   \includegraphics[height=4cm]{sjtu-badge.pdf}
% \end{center}
% \vspace{\stretch{1}}
% \begin{abstract}
% 此宏包旨在建立一个简单易用的上海交通大学论文模板，包括学士、硕士、博士学位论文
% 以及普通课程论文。
% \end{abstract}
% \vspace{\stretch{1}}
% \def\abstractname{免责声明}
% \begin{abstract}
% \noindent
% \begin{enumerate}
% \item 本模板的发布遵守 \LaTeX\ Project Public License，使用前请认真阅读协议内
%   容。
% \item 本模板根据 \href{https://www.gs.sjtu.edu.cn/info/1143/5801.htm}
%   {《上海交通大学博士、硕士学位论文撰写指南》} 以及
%   \href{http://bysj.jwc.sjtu.edu.cn/shownews.aspx?newsno=C1uSkpxqiKCad13AzOcvQA....}
%   {《上海交通大学本科生毕业设计（论文）撰写规范》} 编写而成，同时参考了
%   \href{http://jdgs.sjtu.edu.cn/uploads/%E5%AD%A6%E4%BD%8D%E8%AE%BA%E6%96%87-%E7%AD%94%E8%BE%A9%E7%94%B3%E8%AF%B7%E6%B5%81%E7%A8%8B/11%E5%AD%A6%E4%BD%8D%E8%AE%BA%E6%96%87%E6%A0%BC%E5%BC%8F%E7%9A%84%E7%BB%9F%E4%B8%80%E8%A6%81%E6%B1%82.docx}
%   {《上海交通大学研究生学位论文格式的统一要求》}。旨在供上海交通大学准毕业生撰
%   写学位论文使用。
% \item 此模板仅为撰写指南的参考实现，不保证审查老师不提意见。任何由于使用本模板
%   而引起的论文格式审查问题均与本模板作者无关。
% \item 任何个人或组织以本模板为基础进行修改、扩展而生成的新的专用模板，请严格遵
%   守 \LaTeX\ Project Public License 协议。由于违犯协议而引起的任何纠纷争端均与
%   本模板作者无关。
% \end{enumerate}
% \end{abstract}
% \vspace{\stretch{3}}
%
% \clearpage
% \begin{multicols}{2}[
%   \setlength{\columnseprule}{.4pt}
%   \setlength{\columnsep}{18pt}]
%   \tableofcontents
% \end{multicols}
% \clearpage
%
% \section{介绍}
%
% 这是为撰写上海交通大学学士、硕士、博士学位论文以及课程论文而准备的 \LaTeX\ 模
% 板。
%
% 最早的一版学位模板由一位热心的物理系同学制作，中文字符处理采用了当时最为流行的
% \CJKLaTeX\ 方案。在此基础上，weijianwen 根据交大研究生院对学位论文的要求，完成
% 了一份基本可用的交大 \LaTeX\ 学位论文模板。由于 \CJKLaTeX\ 方案不易使用，
% weijianwen 与 William Wang 开始着手把模板向\XeTeX\ 引擎移植。之后 weijianwen
% 又断断续续做了一些完善模板的工作，在原有硕士学位论文模板的基础上完成了交大学士
% 和博士学位论文模板。
%
% 2012 年 5 月模板开始在 GitHub 上管理和更新，2018 年 1 月项目转移至 SJTUG 名
% 下。2019 年 6 月 Alexara Wu 重构了整个宏包的代码，并使用 doc 和 DocStrip 工具
% 进行代码的管理，升级版本号为 1.0。
%
% 本文档将尽量完整的介绍模板的使用方法，如有不清楚之处可以参考示例文档或者根据
% 第~\ref{sec:howtoask} 节说明提问，有兴趣者都可以参与完善此手册，也非常欢迎对代
% 码的贡献。
%
% \note{模板的作用在于减少论文写作过程中格式调整的时间，前提是遵守模板的用法，否
%   则即便用了\sjtuthesis 也难以保证输出的论文符合学校规范。}
%
% \section{安装}
%
% \subsection{获取 \sjtuthesis}
%
% 你可以在 \href{https://github.com/sjtug/SJTUThesis/releases}{GitHub Release}
% 中找到 \sjtuthesis 的所有版本，推荐使用最新版本以避免一些问题。
%
% \subsection{文件组成}
%
% 表~\ref{tab:files} 列出了 \sjtuthesis 的主要文件及其功能介绍。
%
% \begin{table}[!hbt]
%   \centering
%   \caption{模板的文件组成}
%   \label{tab:files}
%   \begin{tabular}{lll}
%     \toprule
%     类别     & 文件                     & 说明                          \\
%     \midrule
%     源文件   & \file{sjtuthesis.dtx}    & 模板源代码文件 (开发用)        \\
%     \midrule
%     生成文件 & \file{sjtuthesis.cls}    & 文档类文件                    \\
%              & \file{sjtuthesis-*.ltx}  & 文档类辅助文件                \\
%              & \file{sjtu-*.pdf}        & 校徽、校名图片                \\
%              & \file{sjtuthesis.pdf}    & 用户手册 (本文档)             \\
%     \midrule
%     示例文档 & \file{thesis.tex}        & 主文档                        \\
%              & \file{tex/*.tex}         & 示例文档的各个章节            \\
%              & \file{figure/}           & 图片目录                      \\
%              & \file{bib/*.bib}         & 参考文献目录                  \\
%     \midrule
%     其他     & \file{README.md}         & 基本说明                      \\
%              & \file{latexmkrc}         & latexmk 的配置文件            \\
%              & \file{Makefile}          & GNU make 的配置文件           \\
%     \bottomrule
%   \end{tabular}
% \end{table}
%
% \subsection{编译模板}
% \label{sec:process}
%
% 本节介绍几种常见的编译模板生成论文的方法。用户可根据自己的情况选择。
%
% \subsubsection{\texorpdfstring{\XeLaTeX}{XeLaTeX}}
%
% 很多用户对 \LaTeX\ 命令执行的次数不太清楚。一个基本的原则是多次运行 \LaTeX\ 命
% 令直至不再出现警告。下面给出生成示例文档的详细过程（\# 开头的行为注释），首先
% 来看的 \XeLaTeX\ 方式:
%
% \begin{shell}
% # 1.发现文件中的引用关系，文件后缀 .tex 可省略
% xelatex thesis
% # 2.编译参考文件源文件，生成 .bbl 文件
% biber thesis
% # 3.解决文件中的交叉引用
% xelatex thesis
% # 4.生成完整的 pdf 文件
% xelatex thesis
% # 5.更新目录
% xelatex thesis
% \end{shell}
%
% \subsubsection{latexmk}
% \label{sec:latexmk}
%
% \texttt{latexmk} 命令支持全自动生成 \LaTeX\ 编写的文档，并且支持使用不同的工具
% 链来进行生成，它会自动运行多次工具直到交叉引用都被解决。下面给出了一个用
% \texttt{latexmk} 调用 \texttt{xelatex} 生成最终文档的示例：
%
% \begin{shell}
% # 一句话就够了！
% latexmk -xelatex thesis
% \end{shell}
%
% \subsubsection{make}
% \label{sec:make}
%
% 上面的方法虽然不复杂，但是每次都输入还是非常罗嗦，所以 \sjtuthesis 提供了一
% 个 \file{Makefile}：
%
% \begin{shell}
% make thesis.pdf           # 生成示例文档 thesis.pdf
% make clean
% make cleanall
% \end{shell}
%
% \sjtuthesis 的 \file{Makefile} 默认用 \texttt{latexmk} 调用\texttt{xelatex} 编
% 译。如有需要可修改 \file{Makefile} 开头的参数或通过命令行传递参数，进一步还可
% 以修改 \file{.latexmkrc} 进行定制。
%
% \section{使用说明}
%
% 本手册假定用户已经能处理一般的 \LaTeX\ 文档，并对 \BibLaTeX\ 有一定了解。如果
% 从来没有接触过 \TeX\ 和 \LaTeX，建议先学习相关的基础知识。
%
% \subsection{关于提问}
% \label{sec:howtoask}
% 按照优先级推荐提问的位置如下：
%
% \begin{itemize}
%   \item \href{https://github.com/sjtug/SJTUThesis/issues}{Github Issues}
%   \item \href{https://bbs.sjtu.edu.cn/bbsdoc?board=TeX_LaTeX}{水源LaTeX版}
% \end{itemize}
%
% \subsection{示例文件}
% \label{sec:userguide}
%
% 模板核心文件有：\file{sjtuthesis.cls}，\file{sjtuthesis-bachelor.ltx} 和 
% \file{sjtuthesis-graduate.ltx}，但如果没有示例文档会很难下手，所以推荐从模板自
% 带的示例文档入手，其中包括了论文写作用到的所有命令及其使用方法，只需要用自己的
% 内容进行相应替换就可以。对于不清楚的命令可以查阅本手册。下面的例子描述了模板中
% 章节的组织形式，来自于示例文档，具体内容可以参考模板附带的 \file{thesis.tex}
% 和 \file{tex/}。
%
% \lstinputlisting[style=lstStyleLaTeX]{thesis.tex}
%
% \subsection{文档类选项}
%
% \DescribeOption{degree=\meta{degree}}
%   选择论文类型，当前支
%   持：\opt{bachelor}，\opt{master}，\opt{doctor}，\opt{course}。
%   为必选项。
% \begin{latex}
% % 博士论文
% \documentclass[degree=doctor]{sjtuthesis}
%
% % 硕士论文
% \documentclass[degree=master]{sjtuthesis}
% \end{latex}
%
% \DescribeOption{language=\meta{language}}
% 论文的主要语言（默认：中文）。可选：\opt{chinese}，\opt{english}。
%
% \DescribeOption{bibstyle=\meta{bibstyle}}
% 参考文献样式（默认：gb7714-2015）。
% 可选：\opt{gb7714-2015}，\opt{gb7714-2015ay}, \opt{ieee}。
%
% \DescribeOption{review}
% 盲审模式开关（默认:关闭）。
%
% \DescribeOption{unsetfont}
% 是否取消模版预设的西文字体（默认:关闭）。如果取消，则需要自行设置西文字体。
%
% \subsection{中文字体}
%
% \subsubsection{字体配置}
%
% \DescribeOption{fontset=\meta{font}}
% 模板默认使用 \CTeX 的字体配置。默认情况下，本模板可以自动检测操作系统，并配置
% 合适的字体。
% 用户可以在调用文档类时加入选项
% \opt{fontset=mac/windows/adobe} 指定加载的字库，
% 也可以使用 \opt{fontset=none}，然后自行配置，
% 详见 \pkg{ctex}、\pkg{xeCJK}、\pkg{fontspec} 等宏包的使用说明。
%
% 注意，Linux 系统下默认的中文字库 Fandol 容易出现缺字的情况。
% 我们建议 Linux 用户自行配置合适的字体。
%
% \subsubsection{字体命令}
% \label{sec:fontcmds}
% \DescribeMacro{\songti}
% \DescribeMacro{\fangsong}
% \DescribeMacro{\heiti}
% \DescribeMacro{\kaishu}
% 用来切换宋体、仿宋、黑体、楷体四种基本字体。
%
% \begin{latex}
% {\songti   力微任重久神疲，}
% {\fangsong 再竭衰庸定不支。}
% {\heiti    苟利国家生死以，}
% {\kaishu   岂因祸福避趋之？}
% \end{latex}
%
% \DescribeMacro{\zihao\marg{num}}
% 用来切换字号大小。
%
% \subsection{标题页信息}
%
% \DescribeMacro{\maketitle}
% 标题页可由 \cs{maketitle} 命令生成，其中的各项信息提供两种配置方法。
%
% 一是使用 \cs{\meta{item}\marg{info}} 的方式独立设置各项信息，
% 本模板提供的命令如表~\ref{tab:covercmds}，
% 其中带 |en| 前缀的命令是 设置英文标题页的命令：
% \begin{table}[htb]
%   \centering\small
%   \caption{录入标题页信息的命令}
%   \label{tab:covercmds}
%   \begin{tabular}{lll}
%     \toprule
%     命令              & 命令（英文）        & 说明                   \\
%     \midrule
%     \cs{title}        & \cs{entitle}        & 论文标题               \\
%     \cs{keywords}     & \cs{enkeywords}     & 关键字                 \\
%     \cs{author}       & \cs{enauthor}       & 作者姓名               \\
%     \cs{supervisor}   & \cs{ensupervisor}   & 导师姓名               \\
%     \cs{cosupervisor} & \cs{encosupervisor} & 副导师姓名             \\
%     \cs{degree}       & \cs{endegree}       & 申请学位               \\
%     \cs{department}   & \cs{endepartment}   & 院系                   \\
%     \cs{major}        & \cs{enmajor}        & 学科专业               \\
%     \cs{coursename}   & \cs{encoursename}   & 课程名称               \\
%     \cs{fund}         & \cs{enfund}         & 资助基金               \\
%     \cs{date}         & \cs{endate}         & 答辩日期               \\
%     \cs{studentid}    & -                   & 学号                   \\
%     \bottomrule
%   \end{tabular}
% \end{table}
%
% 二是通过统一设置命令 \cs{sjtuSetInfo} 通过\emph{key=value} 形式完成：
% \begin{latex}
% \sjtuSetInfo{
%   title    = XXX,
%   keywords = {AAA, BBB},
% }
% % 可以多次调用
% \sjtuSetInfo{
%   author   = CCC,
%   title    = YYY, % 覆盖 XXX
% }
% \end{latex}
%
% \subsection{摘要和章节}
%
% 对于特殊的章节，\sjtuthesis 还提供了相应的环境：
% \begin{itemize}
%   \item 中文摘要：\env{abstract}
% \DescribeEnv{abstract}
%   \item 英文摘要：\env{enabstract}
% \DescribeEnv{enabstract}
%   \item 符号说明：\env{nomenclature}
% \DescribeEnv{nomenclature}
%   \item 致谢：    \env{acknowledgements}
% \DescribeEnv{acknowledgements}
%   \item 发表成果：\env{publications}
% \DescribeEnv{publications}
%   \item 申请专利：\env{patents}
% \DescribeEnv{patents}
%   \item 参与项目：\env{projects}
% \DescribeEnv{projects}
% \end{itemize}
%
% 目录和图、表清单可以使用命令自动生成：
% \begin{itemize}
%   \item 目录：  \cs{tableofcontents}
% \DescribeMacro{\tableofcontents}
%   \item 图清单：\cs{listoffigures}
% \DescribeMacro{\listoffigures}
%   \item 表清单：\cs{listoftables}
% \DescribeMacro{\listoftables}
% \end{itemize}
%
% \subsection{浮动体}
%
% 图题置于图的下方，表题置于表的上方。
% \LaTeX{} 的 \cs{caption} 命令并不能控制在浮动体中的位置，
% 需要作者注意写在合适的地方。
%
% 关于图片的并排，推荐使用较新的 \pkg{subcaption} 宏包，不建议使用
% \pkg{subfigure} 或 \pkg{subfig}。
%
% 更多的表格样式参见 \pkg{booktabs}（三线表）、\pkg{longtable}（跨页表格）。
%
% 算法可以使用 \pkg{algorithms} 宏包或者较新的 \pkg{algorithm2e}。
%
% \subsection{参考文献}
%
% 教务处要求参考文献外观应符合国家标准 GB/T7714。按照《GB/T 7714-2015》的规定，
% 参考文献的标注体系分为“顺序编码制”和“著者-出版年制”(authoryear)。
%
% 模版默认使用顺序编码制，用户也可以按需要在文档类参数中设置样式，如：
% \begin{shell}
% \documentclass[degree=master, bibstyle=ieee]{sjtuthesis}
% \end{shell}
%
% \DescribeMacro{\cite}
% 在正文中引用文献时应使用 \cs{cite} 命令，可以产生上标引用的参考文献。
% 同一处引用多篇文献时，需要将各篇文献的 key 一同写在参数中，
% 如 |\cite{Meta_CN,chen2007act,DPMG}|。
% 它可以自动排序并用处理连续编号。
%
% \DescribeMacro{\parencite}
% 需要临时将文献序号与正文平排，可以使用 \cs{parencite} 命令。
%
% \DescribeMacro{\printbibliography}
% 参考文献表可以使用 \BibLaTeX\ 生成，其表现形式的控制逻辑通过
% \pkg{biblatex-gb7714-2015} 实现。在文中使用 \cs{printbibliography} 命令输出参
% 考文献表。添加参数 \opt{heading=bibintoc} 可将参考文献表加入目录。
%
% \section{致谢}
%
% \sjtuthesis 模板的许多实现细节离不开 \href{https://github.com/sjtug/SJTUThesis/graphs/contributors}
%  {热心同学们} 的贡献，在此感谢所有为模板贡献过代码的同学们, 以及所有测试和使用
% 模板的各位同学！
%
% \section{实现细节}
%
%    \begin{macrocode}
%<*class>
\RequirePackage{kvoptions}
\SetupKeyvalOptions{
  family=sjtu,
  prefix=sjtu@,
  setkeys=\kvsetkeys}
%    \end{macrocode}
%
% 用 \pkg{kvoptions} 的 \texttt{key=value} 方式来设置论文类型。
%    \begin{macrocode}
\DeclareStringOption[doctor]{degree}[doctor]
%    \end{macrocode}
%
% 论文是否使用英文。
%    \begin{macrocode}
\DeclareStringOption[chinese]{language}[chinese]
%    \end{macrocode}
%
% 参考文献样式。
%    \begin{macrocode}
\DeclareStringOption[gb7714-2015]{bibstyle}[gb7714-2015]
%    \end{macrocode}
%
% 字号大小。
%    \begin{macrocode}
\DeclareStringOption[5]{zihao}[5]
%    \end{macrocode}
%
% 盲审模式开关。
%    \begin{macrocode}
\DeclareBoolOption{review}
%    \end{macrocode}
%
% 是否取消设置西文字体。
%    \begin{macrocode}
\DeclareBoolOption{unsetfont}
%    \end{macrocode}
%
% 将选项传递给 \pkg{ctexbook}。
%    \begin{macrocode}
\DeclareDefaultOption{\PassOptionsToClass{\CurrentOption}{ctexbook}}
%    \end{macrocode}
%
% 解析用户传递过来的选项，并加载 \pkg{ctexbook}。
%    \begin{macrocode}
\ProcessKeyvalOptions*
\newcommand{\sjtu@validate@key}[1]{%
  \@ifundefined{sjtu@\csname sjtu@#1\endcsname true}{%
    \ClassError{sjtuthesis}{Invalid value '\csname sjtu@#1\endcsname'}{}%
  }{%
    \csname sjtu@\csname sjtu@#1\endcsname true\endcsname
  }%
}
\newif\ifsjtu@course
\newif\ifsjtu@bachelor
\newif\ifsjtu@master
\newif\ifsjtu@doctor
\sjtu@validate@key{degree}
\ifsjtu@course\sjtu@bachelortrue\fi
\ifsjtu@doctor\sjtu@mastertrue\fi
\newif\ifsjtu@chinese
\newif\ifsjtu@english
\sjtu@validate@key{language}
\ifsjtu@english
  \PassOptionsToClass{scheme=plain}{ctexbook}
\fi
%    \end{macrocode}
%
% 使用 XeTeX 引擎时，fontspec 宏包会被 xeCJK 自动调用。传递给 fontspec 宏包
% no-math 选项，避免部分数学符号字体自动调整为 CMR。
%    \begin{macrocode}
\PassOptionsToPackage{no-math}{fontspec}
%    \end{macrocode}
%
% 使用 \pkg{ctexbook} 类，优于调用 \pkg{ctex} 宏包。
%    \begin{macrocode}
\LoadClass[a4paper,zihao=\sjtu@zihao,linespread=1.3,UTF8]{ctexbook}
%    \end{macrocode}
%
% 根据选项载入配置文件。
%    \begin{macrocode}
\ifsjtu@bachelor%
  \AtEndOfClass{\input{sjtuthesis-bachelor.ltx}}
\else
  \ifsjtu@master%
    \AtEndOfClass{\input{sjtuthesis-graduate.ltx}}
  \fi
\fi
%    \end{macrocode}
%
% \subsection{载入宏包}
%
% 建议在模板开始处载入全部宏包，不要轻易改变加载顺序。\pkg{hyperref} 一般在最后
% 加载。
%    \begin{macrocode}
\RequirePackage{etoolbox}
\RequirePackage{xparse}
\RequirePackage{environ}
%    \end{macrocode}
%
% 使用 \pkg{geometry} 设置页面。
%    \begin{macrocode}
\RequirePackage{geometry}
%    \end{macrocode}
%
% 使用 \pkg{fancyhdr} 设置页眉页脚。
%    \begin{macrocode}
\RequirePackage{fancyhdr}
%    \end{macrocode}
%
% 使用 \pkg{pageslts} 设置页码格式。
%    \begin{macrocode}
\RequirePackage{pageslts}
%    \end{macrocode}
%
% 使用 \pkg{mathtools} 处理数学公式。
%    \begin{macrocode}
\RequirePackage{mathtools}
%    \end{macrocode}
%
% 字体相关宏包。
%    \begin{macrocode}
\ifsjtu@unsetfont\relax\else
  \RequirePackage[defaultsups]{newtxtext}
  \RequirePackage[upint]{newtxmath}
  \RequirePackage[opentype,scaled=.9]{sourcecodepro}
  \RequirePackage{bm}
  \RequirePackage{upgreek}
\fi
\RequirePackage{anyfontsize}
%    \end{macrocode}
%
% 颜色支持宏包。
%    \begin{macrocode}
\RequirePackage{xcolor}
%    \end{macrocode}
%
% 图形支持宏包。
%    \begin{macrocode}
\RequirePackage{graphicx}
%    \end{macrocode}
%
% 表格支持宏包。
%    \begin{macrocode}
\RequirePackage{array}
\RequirePackage{booktabs}
\RequirePackage{longtable}
%    \end{macrocode}
%
% 题注支持宏包。
%    \begin{macrocode}
\RequirePackage{caption}
\RequirePackage[list=off]{bicaption}
\RequirePackage{subcaption}
%    \end{macrocode}
%
% 参考文献支持宏包。
%    \begin{macrocode}
\RequirePackage[backend=biber,style=\sjtu@bibstyle]{biblatex}
%    \end{macrocode}
%
% 使用 \pkg{tocloft} 设置目录格式。
%    \begin{macrocode}
\RequirePackage[titles]{tocloft}
%    \end{macrocode}
%
% \pkg{enumitem} 更好的列表环境。
%    \begin{macrocode}
\RequirePackage[inline]{enumitem}
%    \end{macrocode}
%
% 脚注支持宏包。
%    \begin{macrocode}
\RequirePackage[perpage, bottom]{footmisc}
%    \end{macrocode}
%
% \pkg{pdfpages} 便于我们插入扫描版的原创性声明和授权声明 PDF 文档。
%    \begin{macrocode}
\RequirePackage{pdfpages}
\includepdfset{fitpaper=true}
%    \end{macrocode}
%
% \pkg{hyperref} 处理超链接。
%    \begin{macrocode}
\RequirePackage{hyperref}
%    \end{macrocode}
%
% \subsection{信息录入}
%
% 定义命令用于录入信息。
%    \begin{macrocode}
\newcommand{\sjtu@def@term}[1]{%
  \expandafter\gdef\csname #1\endcsname##1{%
    \expandafter\gdef\csname sjtu@value@#1\endcsname{##1}}
  \csname #1\endcsname{}
  \define@key{sjtuvalue}{#1}{\csname #1\endcsname{##1}}}
%    \end{macrocode}
%
% 论文中英文题目。
%    \begin{macrocode}
\sjtu@def@term{title}
\sjtu@def@term{entitle}
%    \end{macrocode}
%
% 关键字。
%    \begin{macrocode}
\sjtu@def@term{keywords}
\sjtu@def@term{enkeywords}
%    \end{macrocode}
%
% 作者、导师、副导师。
%    \begin{macrocode}
\sjtu@def@term{author}
\sjtu@def@term{supervisor}
\sjtu@def@term{assisupervisor}
\sjtu@def@term{enauthor}
\sjtu@def@term{ensupervisor}
\sjtu@def@term{enassisupervisor}
%    \end{macrocode}
%
% 学号。
%    \begin{macrocode}
\sjtu@def@term{studentid}
%    \end{macrocode}
%
% 申请学位中英文名称。
%    \begin{macrocode}
\sjtu@def@term{degree}
\sjtu@def@term{endegree}
%    \end{macrocode}
%
% 院系中英文名称。
%    \begin{macrocode}
\sjtu@def@term{department}
\sjtu@def@term{endepartment}
%    \end{macrocode}
%
% 专业中英文名称。
%    \begin{macrocode}
\sjtu@def@term{major}
\sjtu@def@term{enmajor}
%    \end{macrocode}
%
% 课程中英文名称。
%    \begin{macrocode}
\sjtu@def@term{coursename}
\sjtu@def@term{encoursename}
%    \end{macrocode}
%
% 资助基金名称。
%    \begin{macrocode}
\sjtu@def@term{fund}
\sjtu@def@term{enfund}
%    \end{macrocode}
%
% 答辩日期。
%    \begin{macrocode}
\sjtu@def@term{date}
\sjtu@def@term{endate}
\NewDocumentCommand\sjtuSetInfo{}{\setkeys{sjtuvalue}}
%    \end{macrocode}
%
% 定义一些文字常量。
%    \begin{macrocode}
\newcommand{\sjtu@def@label}[2]{%
  \expandafter\gdef\csname sjtu@label@#1\endcsname{#2}
  \define@key{sjtulabel}{#1}{%
    \expandafter\gdef\csname sjtu@label@#1\endcsname{##1}}}
\sjtu@def@label{schoolChi}{上海交通大学}
\sjtu@def@label{schoolEng}{Shanghai Jiao Tong University}
%</class>
%<*bachelor>
\ifsjtu@course
  \sjtu@def@label{degreetypeChi}{}
  \sjtu@def@label{degreetypeEng}{}
\else
  \sjtu@def@label{degreetypeChi}{学士}
  \sjtu@def@label{degreetypeEng}{Bachelor}
\fi
\sjtu@def@label{authorChi}{学生姓名}
\sjtu@def@label{studentidChi}{学生学号}
\sjtu@def@label{supervisorChi}{指导教师}
\sjtu@def@label{coursenameChi}{课程名称}
\sjtu@def@label{majorChi}{专业}
\sjtu@def@label{departmentChi}{学院(系)}
\ifsjtu@course
  \sjtu@def@label{thesiscat}{课程论文}
  \def\sjtu@label@thesistype{\sjtu@label@thesiscat}
  \sjtu@def@label{subjectChi}{\sjtu@label@thesiscat}
  \sjtu@def@label{subjectEng}{Course Paper}
\else
  \sjtu@def@label{thesiscat}{学位论文}
  \def\sjtu@label@thesistype{毕业设计（论文）}
  \sjtu@def@label{subjectChi}{\sjtu@label@degreetypeChi\sjtu@label@thesiscat}
  \sjtu@def@label{subjectEng}{Thesis of \sjtu@label@degreetypeEng}
\fi
\sjtu@def@label{bigabstract}{英文大摘要}
%</bachelor>
%<*graduate>
\ifsjtu@doctor
  \sjtu@def@label{degreetypeChi}{博士}
  \sjtu@def@label{degreetypeEng}{Doctor}
\else
  \sjtu@def@label{degreetypeChi}{硕士}
  \sjtu@def@label{degreetypeEng}{Master}
\fi
\sjtu@def@label{authorChi}{\sjtu@label@degreetypeChi 研究生}
\sjtu@def@label{authorEng}{Candidate}
\sjtu@def@label{studentidChi}{学号}
\sjtu@def@label{studentidEng}{Student ID}
\sjtu@def@label{supervisorChi}{导师}
\sjtu@def@label{supervisorEng}{Supervisor}
\sjtu@def@label{assisupervisorChi}{副导师}
\sjtu@def@label{assisupervisorEng}{Assistant Supervisor}
\sjtu@def@label{degreeChi}{申请学位}
\sjtu@def@label{degreeEng}{Academic Degree Applied for}
\sjtu@def@label{majorChi}{学科}
\sjtu@def@label{majorEng}{Speciality}
\sjtu@def@label{departmentChi}{所在单位}
\sjtu@def@label{departmentEng}{Affiliation}
\sjtu@def@label{defenddateChi}{答辩日期}
\sjtu@def@label{defenddateEng}{Date of Defence}
\sjtu@def@label{conferringChi}{授予学位单位}
\sjtu@def@label{conferringEng}{Degree-Conferring-Institution}
\sjtu@def@label{fundChi}{资助基金}
\sjtu@def@label{fundEng}{Funded by}
\sjtu@def@label{thesiscat}{学位论文}
\def\sjtu@label@thesistype{\sjtu@label@thesiscat}
\sjtu@def@label{subjectChi}{%
  \sjtu@label@schoolChi\sjtu@label@degreetypeChi\sjtu@label@thesiscat
}
\sjtu@def@label{subjectEng}{%
  Dissertation Submitted to \sjtu@label@schoolEng \\%
  for the Degree of \sjtu@label@degreetypeEng
}
%</graduate>
%<*class>
\sjtu@def@label{originalityChi}{原创性声明}
\sjtu@def@label{originalityEng}{Declaration of Originality}
\sjtu@def@label{authorizationChi}{版权使用授权书}
\sjtu@def@label{authorizationEng}{Declaration of Authorization}
\sjtu@def@label{origtitle}{\sjtu@label@thesistype\sjtu@label@originalityChi}
\sjtu@def@label{authtitle}{\sjtu@label@thesistype\sjtu@label@authorizationChi}
\sjtu@def@label{origbody}{%
  本人郑重声明：所呈交的\sjtu@label@thesistype ，是本人在导师的指导下，
  独立进行研究工作所取得的成果。除文中已经注明引用的内容外，本论文不包含
  任何其他个人或集体已经发表或撰写过的作品成果。对本文的研究做出重要贡献
  的个人和集体，均已在文中以明确方式标明。本人完全意识到本声明的法律结果
  由本人承担。}
\sjtu@def@label{authbody}{%
  本\sjtu@label@thesistype 作者
  完全了解学校有关保留、使用\sjtu@label@thesistype 的规定，同意学校保留
  并向国家有关部门或机构送交论文的复印件和电子版，允许论文被查阅和借阅。
  本人授权\sjtu@label@schoolChi 可以将本\sjtu@label@thesistype 的全部或
  部分内容编入有关数据库进行检索，可以采用影印、缩印或扫描等复制手段保存
  和汇编本\sjtu@label@thesistype 。}
\sjtu@def@label{abstractChi}{摘\quad 要}
\sjtu@def@label{abstractEng}{Abstract}
\sjtu@def@label{keywordsChi}{关键词：}
\sjtu@def@label{keywordsEng}{Key words:~}
\ifsjtu@english
  \sjtu@def@label{titlepage}{Title Page}
  \def\sjtu@label@originality{\sjtu@label@originalityEng}
  \def\sjtu@label@authorization{\sjtu@label@authorizationEng}
  \def\sjtu@label@abstract{\sjtu@label@abstractEng}
  \sjtu@def@label{contents}{Contents}
  \sjtu@def@label{figure}{Figure}
  \sjtu@def@label{listfigure}{List of Figures}
  \sjtu@def@label{table}{Table}
  \sjtu@def@label{listtable}{List of Tables}
  \sjtu@def@label{algorithm}{Algorithm}
  \sjtu@def@label{listalgorithm}{List of Algorithms}
  \sjtu@def@label{nomenclature}{Nomenclature}
  \sjtu@def@label{summary}{Summary}
  \sjtu@def@label{acknowledgements}{Acknowledgements}
  \sjtu@def@label{publications}{Publications}
  \sjtu@def@label{patents}{Patents}
  \sjtu@def@label{projects}{Projects}
  \sjtu@def@label{resume}{Resume}
\else
  \sjtu@def@label{titlepage}{扉页}
  \def\sjtu@label@originality{\sjtu@label@originalityChi}
  \def\sjtu@label@authorization{\sjtu@label@authorizationChi}
  \def\sjtu@label@abstract{\sjtu@label@abstractChi}
  \sjtu@def@label{contents}{目\quad 录}
  \sjtu@def@label{figure}{图}
  \sjtu@def@label{listfigure}{插图索引}
  \sjtu@def@label{table}{表}
  \sjtu@def@label{listtable}{表格索引}
  \sjtu@def@label{algorithm}{算法}
  \sjtu@def@label{listalgorithm}{算法索引}
  \sjtu@def@label{nomenclature}{主要符号对照表}
  \sjtu@def@label{summary}{全文总结}
  \sjtu@def@label{acknowledgements}{致\quad 谢}
  \sjtu@def@label{publications}%
                 {攻读\sjtu@label@degreetypeChi 学位期间已发表或录用的论文}
  \sjtu@def@label{patents}%
                 {攻读\sjtu@label@degreetypeChi 学位期间申请的专利}
  \sjtu@def@label{projects}%
                 {攻读\sjtu@label@degreetypeChi 学位期间参与的项目}
  \sjtu@def@label{resume}{简\quad 历}
\fi
\NewDocumentCommand\sjtuSetLabel{}{\setkeys{sjtulabel}}
\ctexset{%
  contentsname   = \sjtu@label@contents,
  listfigurename = \sjtu@label@listfigure,
  listtablename  = \sjtu@label@listtable}
%</class>
%    \end{macrocode}
%
% \subsection{页面设置}
%
% 设置纸张、页边距。
%    \begin{macrocode}
%<*(bachelor|graduate)>
\geometry{%
  paper      = a4paper,
%<*bachelor>
  vmargin    = {84bp, 72bp},
  hmargin    = 90bp,
  headheight = 60bp,
  headsep    = 12bp,
%</bachelor>
%<*graduate>
  top        = 3.5cm,
  bottom     = 4.0cm,
  left       = 3.3cm,
  right      = 2.8cm,
  headheight = 1.0cm,
  headsep    = 0.5cm,
%</graduate>
}
%    \end{macrocode}
%
% 设置页眉页脚。
%    \begin{macrocode}
%<*bachelor>
\ifsjtu@english
  \def\sjtu@titlemark{\sjtu@value@entitle}
  \newcommand{\sjtu@fancyhead}{%
    \parbox[b]{0.75\textwidth}{%
      \raggedleft\nouppercase{\footnotesize\heiti\sjtu@titlemark}}}
  \newcommand{\sjtu@fancyfoot}[2]{%
    \small --~~Page~~{\bfseries{#1}}~~of~~{\bfseries{#2}}~~--}
\else
  \def\sjtu@titlemark{\sjtu@value@title}
  \newcommand{\sjtu@fancyhead}{%
    \parbox[b]{0.75\textwidth}{%
      \raggedleft\nouppercase{\small\heiti\sjtu@titlemark}}}
  \newcommand{\sjtu@fancyfoot}[2]{%
    \small 第~{\bfseries{#1}}~页\,共~{\bfseries{#2}}~页}
\fi
\fancypagestyle{sjtu@front}{%
  \fancyhf{}
  \fancyhead[L]{\includegraphics{sjtu-logo.pdf}}
  \fancyhead[R]{\sjtu@fancyhead}
  \fancyfoot[C]{\sjtu@fancyfoot{\thepage}{\lastpageref{pagesLTS.Roman}}}
}
%</bachelor>
%<*graduate>
\newcommand{\sjtu@fancyfoot}[2]{
  \ifsjtu@review\relax\else
    \ifx#2\@empty\else
      \zihao{-5}{\bfseries #1}\\{#2}
    \fi
  \fi
}
\fancypagestyle{sjtu@title}{%
  \fancyhf{}
  \fancyfoot[C]{\sjtu@fancyfoot{\sjtu@label@fundChi}{\sjtu@value@fund}}
  \renewcommand{\headrulewidth}{0pt}
  \renewcommand{\footrulewidth}{0pt}
}
\fancypagestyle{sjtu@entitle}{%
  \fancyhf{}
  \fancyfoot[C]{\sjtu@fancyfoot{\sjtu@label@fundEng}{\sjtu@value@enfund}}
  \renewcommand{\headrulewidth}{0pt}
  \renewcommand{\footrulewidth}{0pt}
}
%</graduate>
\fancypagestyle{sjtu@plain}{%
  \fancyhf{}
%<*bachelor>
  \fancyhead[L]{\includegraphics{sjtu-logo.pdf}}
  \fancyhead[R]{\sjtu@fancyhead}
  \fancyfoot[C]{\sjtu@fancyfoot{\thepage}{\lastpageref{pagesLTS.arabic}}}
%</bachelor>
%<*graduate>
  \fancyhead[C]{\zihao{-5}\sjtu@label@subjectChi}
  \fancyfoot[C]{\small ---~{\bfseries\thepage}~---}
  \renewcommand{\headrule}{%
    \hrule\@height2.25\p@\@width\headwidth
    \vskip 0.75\p@
    \hrule\@height0.75\p@\@width\headwidth
    \vskip -2.75\p@
  }
%</graduate>
}
%<*bachelor>
\fancypagestyle{sjtu@biglast}{%
  \fancyhf{}
  \fancyhead[L]{\includegraphics{sjtu-logo.pdf}}
  \fancyhead[R]{\sjtu@fancyhead}
  \fancyfoot[C]{\sjtu@fancyfoot{\theCurrentPageLocal}%
                               {\lastpageref{pagesLTS.roman.local}}}
}
%</bachelor>
%</(bachelor|graduate)>
%    \end{macrocode}
%
% \subsection{主文档格式}
%
% \subsubsection{Three matters}
%
% \begin{macro}{\cleardoublepage}
% 空白页清空页眉页脚。
%    \begin{macrocode}
%<*class>
\patchcmd\cleardoublepage%
  {\newpage}{\thispagestyle{empty}\newpage}
  {}{}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\chapter}
% 每章第一页默认会设置特殊的 pagestyle, 我们将其清除。
%    \begin{macrocode}
\patchcmd\chapter%
  {\thispagestyle{\CTEX@chapter@pagestyle}}{}
  {}{}
%    \end{macrocode}
% \end{macro}
%
% 设置文档开始时初始的页码与页眉页脚风格。
%    \begin{macrocode}
\AtBeginDocument{%
  \pagenumbering{Alph}
  \pagestyle{empty}}
%</class>
%    \end{macrocode}
%
% \begin{macro}{\frontmatter}
% \begin{macro}{\mainmatter}
% 前言的页码设置为大写罗马数字，同时设置前言与正文的页眉页脚风格。
%    \begin{macrocode}
%<*(bachelor|graduate)>
\renewcommand{\frontmatter}{%
  \cleardoublepage
  \@mainmatterfalse
  \pagenumbering{Roman}
%<bachelor>  \pagestyle{sjtu@front}
%<graduate>  \pagestyle{sjtu@plain}
}
\renewcommand{\mainmatter}{%
  \cleardoublepage
  \@mainmattertrue
  \sjtu@setfloatfonttrue
  \pagenumbering{arabic}
  \pagestyle{sjtu@plain}
}
\renewcommand{\backmatter}{%
  \cleardoublepage
  \@mainmatterfalse
}
%</(bachelor|graduate)>
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \subsubsection{章节标题}
% 各级标题格式设置。
%    \begin{macrocode}
%<*class>
\ctexset{%
  chapter={%
    format       = \zihao{3}\bfseries\heiti\centering,
    nameformat   = {},
    titleformat  = {},
    aftername    = \quad,
    afterindent  = true,
    beforeskip   = 1ex,
    afterskip    = 2ex
  },
  section={%
    format       = \zihao{4}\bfseries\heiti,
    afterindent  = true,
    afterskip    = 1ex \@plus .2ex
  },
  subsection={%
    format       = \zihao{-4}\bfseries\heiti,
    afterindent  = true,
    afterskip    = 1ex \@plus .2ex
  },
  subsubsection={%
    format       = \zihao{-4}\normalfont,
    afterindent  = true,
    afterskip    = 1ex \@plus .2ex
  },
  paragraph/afterindent    = true,
  subparagraph/afterindent = true}
%</class>
%    \end{macrocode}
%
% 本科与研究生论文三级标题格式不同。
%    \begin{macrocode}
%<*bachelor>
\ctexset{%
  subsection/format = \zihao{-4}\normalfont,
}
%</bachelor>
%    \end{macrocode}
%
% \subsubsection{段落}
%
% 全文首行缩进 2 字符，标点符号用全角。
%    \begin{macrocode}
%<*class>
\ctexset{%
  punct          = quanjiao,
  space          = auto,
  autoindent     = true}
%    \end{macrocode}
%
% 使用松散的断行模式。
%    \begin{macrocode}
\AtEndOfClass{\sloppy}
%    \end{macrocode}
%
% 利用 \pkg{enumitem} 命令调整默认列表环境间的距离，以符合中文习惯。
%    \begin{macrocode}
\setlist{nosep}
\setlist*{leftmargin=*}
\setlist[1]{labelindent=\parindent}
%    \end{macrocode}
%
% \subsubsection{目录}
%
% 章节编号深度最多 4 层，即: x.x.x.x，对应的命令和层序号分别是：
% \cs{chapter}(0), \cs{section}(1), \cs{subsection}(2), \cs{subsubsection}(3)。
%    \begin{macrocode}
\setcounter{secnumdepth}{3}
\setcounter{tocdepth}{2}
%    \end{macrocode}
%
% \begin{macro}{\tableofcontents}
% 目录生成命令，添加 PDF 标签。
%    \begin{macrocode}
\renewcommand{\tableofcontents}{%
  \cleardoublepage%
  \pdfbookmark[0]{\contentsname}{toc}%
  \chapter*{\contentsname}%
  \@mkboth{\contentsname}{\contentsname}%
  \@starttoc{toc}
}
\renewcommand{\listoffigures}{%
  \cleardoublepage%
  \pdfbookmark[0]{\listfigurename}{lof}%
  \chapter*{\listfigurename}%
  \@mkboth{\listfigurename}{\listfigurename}%
  \@starttoc{lof}
}
\renewcommand{\listoftables}{%
  \cleardoublepage%
  \pdfbookmark[0]{\listtablename}{lot}%
  \chapter*{\listtablename}%
  \@mkboth{\listtablename}{\listtablename}%
  \@starttoc{lot}
}
%</class>
%    \end{macrocode}
% \end{macro}
%
% 本科与研究生论文设置不同的目录格式。
%    \begin{macrocode}
%<*bachelor>
\renewcommand{\cftchapfont}{\normalfont}
\renewcommand{\cftchapleader}{\normalfont\cftdotfill{\cftdotsep}}
\renewcommand{\cftchappagefont}{\normalfont}
%</bachelor>
%<*graduate>
\renewcommand{\cftchapfont}{\bfseries\heiti}
\renewcommand{\cftchapleader}{\normalfont\cftdotfill{\cftdotsep}}
%</graduate>
%    \end{macrocode}
%
% 图表索引前加下“图”，“表”关键词。
%    \begin{macrocode}
%<*class>
\renewcommand{\cftfigpresnum}{\sjtu@label@figure~}
\renewcommand{\cfttabpresnum}{\sjtu@label@table~}
\AtEndPreamble{%
  \newlength{\sjtu@cftfignumwidth@tmp}
    \settowidth{\sjtu@cftfignumwidth@tmp}{\cftfigpresnum}
  \addtolength{\cftfignumwidth}{\sjtu@cftfignumwidth@tmp}
  \newlength{\sjtu@cfttabnumwidth@tmp}
    \settowidth{\sjtu@cfttabnumwidth@tmp}{\cfttabpresnum}
  \addtolength{\cfttabnumwidth}{\sjtu@cfttabnumwidth@tmp}
}
%    \end{macrocode}
%
% \subsubsection{浮动对象以及表格}
%
% 下面这组命令使浮动对象的缺省值稍微宽松一点，从而防止幅度对象占据过多的文本页
% 面，也可以防止在很大空白的浮动页上放置很小的图形。
%    \begin{macrocode}
\renewcommand{\textfraction}{0.15}
\renewcommand{\topfraction}{0.85}
\renewcommand{\bottomfraction}{0.65}
\renewcommand{\floatpagefraction}{0.60}
%    \end{macrocode}
%
% 定义公式、图、表的编号为“3-1”的形式，即分隔符由“.”变为“-”。
%    \begin{macrocode}
\AtBeginDocument{%
  \renewcommand{\theequation}{\thechapter--\arabic{equation}}
  \renewcommand{\thefigure}{\thechapter--\arabic{figure}}
  \renewcommand{\p@subfigure}{\thefigure}
  \renewcommand{\thetable}{\thechapter--\arabic{table}}
}
%    \end{macrocode}
%
% 设置浮动体内的默认字号。
%    \begin{macrocode}
\newif\ifsjtu@setfloatfont
\renewcommand{\@floatboxreset}{%
  \reset@font
  \ifsjtu@setfloatfont
    \zihao{5}
  \else
    \normalsize
  \fi
  \@setminipage
}
\BeforeBeginEnvironment{longtable}
  {\begingroup\ifsjtu@setfloatfont\zihao{5}\fi}
\AfterEndEnvironment{longtable}
  {\endgroup}
\NewDocumentCommand{\sjtuSetFloatFontOn}{}{\sjtu@setfloatfonttrue}
\NewDocumentCommand{\sjtuSetFloatFontOff}{}{\sjtu@setfloatfontfalse}
%    \end{macrocode}
%
% 设置双语题注。
%    \begin{macrocode}
\DeclareCaptionFont{sjtucaptionfont}{\zihao{5}\kaishu}
\DeclareCaptionFont{sjtusubcaptionfont}{\zihao{5}\normalfont}
\captionsetup{%
  format        = plain,
  labelformat   = simple,
  labelsep      = space,
  justification = centering,
  font          = sjtucaptionfont
}
\captionsetup[sub]{%
  format        = hang,
  labelformat   = brace,
  justification = justified,
  font          = sjtusubcaptionfont
}
\DeclareCaptionOption{bi-first}[]{%
  \def\tablename{\sjtu@label@table}
  \def\figurename{\sjtu@label@figure}}
\DeclareCaptionOption{bi-second}[]{%
  \def\tablename{Table}
  \def\figurename{Figure}}
\captionsetup[bi-first]{bi-first}
\captionsetup[bi-second]{bi-second}
%    \end{macrocode}
%
% \subsubsection{数学相关}
%
% \begin{macro}{\Re}
% \begin{macro}{\Im}
% 实部、虚部操作符使用罗马体 $\mathrm{Re}$、$\mathrm{Im}$ 而不是 fraktur 体
% $\Re$、$\Im$。
%    \begin{macrocode}
\AtBeginDocument{%
  \renewcommand{\Re}{\operatorname{Re}}%
  \renewcommand{\Im}{\operatorname{Im}}%
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\upe}
% \begin{macro}{\upi}
% \begin{macro}{\upj}
% \begin{macro}{\dif}
% 提供一些方便的命令：
%    \begin{macrocode}
\newcommand\upe{\mathrm{e}}
\newcommand\upi{\mathrm{i}}
\newcommand\upj{\mathrm{j}}
\newcommand\dif{\mathop{}\!\mathrm{d}}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \subsubsection{声明}
%
% 支持扫描文件替换。
%    \begin{macrocode}
\newcommand{\sjtu@square}{%
  \begingroup\CJKfamily+{zhsong}\symbol{"25A1}\endgroup
}
\newcommand{\sjtu@authconf}{%
  \par\hspace{7em}%
  {\heiti 保\quad 密}~\sjtu@square，在 \uline{\hspace{3em}}
  年解密后适用本授权书。\par
  本\sjtu@label@thesiscat 属于
  \par\hspace{7em}%
  {\heiti 不保密}~\sjtu@square。
  \vskip 1ex
  （请在以上方框内打“$\checkmark$”）
}
\newcommand{\sjtu@signbox}[1]{%
  \parbox{.45\textwidth}{%
    #1 签名： \vskip 4em%
    日期： \hspace{\stretch{3}} 年%
    \hspace{\stretch{2}} 月 \hspace{\stretch{2}} 日%
  }
}
\NewDocumentCommand{\makeDeclareOriginality}{o}{%
  \ifsjtu@review\relax\else
    \cleardoublepage
    \pdfbookmark[0]{\sjtu@label@originality}{origtitle}
    \IfNoValueTF{#1}{%
      \thispagestyle{empty}
      \chapter*{\zihao{-2}\sjtu@label@schoolChi \\%
                \sjtu@label@origtitle}
      \begingroup
        \zihao{4}
        \sjtu@label@origbody
        \vskip 16ex
        \noindent
        \begin{minipage}{\textwidth}
          \hfill
          \sjtu@signbox{\sjtu@label@thesiscat 作者}
        \end{minipage}
      \endgroup
    }
    {\includepdf[pagecommand={\thispagestyle{empty}}]{#1}}
    \cleardoublepage
  \fi
}
\NewDocumentCommand{\makeDeclareAuthorization}{o}{%
  \ifsjtu@review\relax\else
    \cleardoublepage
    \pdfbookmark[0]{\sjtu@label@authorization}{authtitle}
    \IfNoValueTF{#1}{%
      \thispagestyle{empty}
      \chapter*{\zihao{-2}\sjtu@label@schoolChi \\%
                \sjtu@label@authtitle}
      \begingroup
        \zihao{4}
        \sjtu@label@authbody
        \vskip 1ex
        \sjtu@authconf
        \vskip 16ex
        \noindent
        \begin{minipage}{\textwidth}
          \sjtu@signbox{\sjtu@label@thesiscat 作者}
          \hfill
          \sjtu@signbox{指导教师}
        \end{minipage}
      \endgroup
    }
    {\includepdf[pagecommand={\thispagestyle{empty}}]{#1}}
    \cleardoublepage
  \fi
}
%</class>
%    \end{macrocode}
%
% \subsubsection{摘要}
%
% 定义摘要环境，本科与研究生论文的摘要样式要求略有不同。
%    \begin{macrocode}
%<*(bachelor|graduate)>
\NewDocumentEnvironment{abstract}{}{%
  \cleardoublepage
  \pdfbookmark[0]{\sjtu@label@abstract}{abstract}
  \chapter*{%
    \sjtu@value@title \vskip 2ex
    \begingroup
%<bachelor>      \zihao{4}
      \sjtu@label@abstractChi
    \endgroup
  }
  \@mkboth{\sjtu@label@abstractChi}%
          {\sjtu@label@abstractChi}%
%<graduate>  \zihao{4}
}{%
  \vskip 3ex \noindent
  \begingroup
%<bachelor>    \zihao{-4}
    \heiti\sjtu@label@keywordsChi
  \endgroup
  \begingroup
%<bachelor>    \zihao{5}
    \sjtu@value@keywords
  \endgroup
}
%    \end{macrocode}
%
% 英文摘要。
%    \begin{macrocode}
\NewDocumentEnvironment{enabstract}{}{%
  \cleardoublepage
  \chapter*{%
    \MakeUppercase\sjtu@value@entitle \vskip 2ex
    \begingroup
%<bachelor>      \zihao{4}
      \MakeUppercase\sjtu@label@abstractEng
    \endgroup
  }
  \@mkboth{\sjtu@label@abstractEng}%
          {\sjtu@label@abstractEng}%
%<graduate>  \zihao{4}
}{%
  \vskip 3ex \noindent
  \begingroup
%<bachelor>    \zihao{-4}\bfseries
%<graduate>    \bfseries\MakeUppercase
    \sjtu@label@keywordsEng
  \endgroup
  \begingroup
%<bachelor>    \zihao{5}
    \sjtu@value@enkeywords
  \endgroup
}
%    \end{macrocode}
%
% 本科论文英文大摘要。
%    \begin{macrocode}
\newcommand{\sjtu@bigabstract}[1]{\long\gdef\sjtu@bigabstract@body{#1}}
\NewDocumentEnvironment{bigabstract}{}{%
  \Collect@Body\sjtu@bigabstract
}{%
%<*bachelor>
  \ifsjtu@course\relax\else
    \ifsjtu@english\relax\else
      \AtEndDocument{%
        \cleardoublepage
        \pagenumbering{roman}
        \pagestyle{sjtu@biglast}
        \pdfbookmark[0]{\sjtu@label@bigabstract}{bigabstract}%
        \chapter*{\MakeUppercase\sjtu@value@entitle}
        \@mkboth{\sjtu@label@bigabstract}%
                {\sjtu@label@bigabstract}%
        \sjtu@bigabstract@body
      }
    \fi
  \fi
%</bachelor>
%<graduate>  \relax
}
%</(bachelor|graduate)>
%    \end{macrocode}
%
% \subsubsection{主要符号对照表}
%
% 使用 \pkg{longtable} 实现符号对照表。
%    \begin{macrocode}
%<*class>
\NewDocumentEnvironment{nomenclature}{m}{%
  \cleardoublepage
  \pdfbookmark[0]{\sjtu@label@nomenclature}{nomenclature}
  \chapter*{\sjtu@label@nomenclature}
  \@mkboth{\sjtu@label@nomenclature}%
          {\sjtu@label@nomenclature}%
  \begin{longtable}{#1}
}{\end{longtable}}
%    \end{macrocode}
%
% \subsubsection{全文总结}
%
%    \begin{macrocode}
\NewDocumentEnvironment{summary}{}{%
  \cleardoublepage
  \chapter*{\sjtu@label@summary}
  \@mkboth{\sjtu@label@summary}%
          {\sjtu@label@summary}%
  \addcontentsline{toc}{chapter}{\sjtu@label@summary}%
}{}
%    \end{macrocode}
%
% \subsubsection{致谢}
%
% 定义致谢环境，盲审模式下隐藏致谢。
%    \begin{macrocode}
\newcommand{\sjtu@acknowledgements}[1]{\long\gdef\sjtu@acknowledgements@body{#1}}
\NewDocumentEnvironment{acknowledgements}{}{%
  \Collect@Body\sjtu@acknowledgements
}{%
  \ifsjtu@review\relax\else
    \cleardoublepage
    \chapter*{\sjtu@label@acknowledgements}
    \@mkboth{\sjtu@label@acknowledgements}%
            {\sjtu@label@acknowledgements}%
    \addcontentsline{toc}{chapter}{\sjtu@label@acknowledgements}%
    \sjtu@acknowledgements@body
  \fi
}
%    \end{macrocode}
%
% \subsubsection{附录}
%
% 定义附录使用的列表环境，使用和参考文献列表相同的样式。
%    \begin{macrocode}
\newenvironment{sjtu@bibliolist}[2]{%
  \cleardoublepage
  \chapter{#2}
  \@mkboth{#2}{#2}%
  \list{\@biblabel{\@arabic\c@enumiv}}%
       {\settowidth\labelwidth{\@biblabel{#1}}%
        \leftmargin\labelwidth
        \advance\leftmargin\labelsep
        \@openbib@code
        \usecounter{enumiv}%
        \let\p@enumiv\@empty
        \renewcommand\theenumiv{\@arabic\c@enumiv}}%
  \sloppy
  \clubpenalty4000
  \@clubpenalty \clubpenalty
  \widowpenalty4000%
  \sfcode`\.\@m
}{%
  \def\@noitemerr
    {\@latex@warning{Empty `bibliolist' environment}}%
  \endlist
}
%    \end{macrocode}
%
% 分别定义论文、专利和项目三个附录环境。
%    \begin{macrocode}
\newcommand{\sjtu@publications}[1]{\long\gdef\sjtu@publications@body{#1}}
\NewDocumentEnvironment{publications}{O{99}}{%
  \Collect@Body\sjtu@publications
}{%
  \ifsjtu@review\relax\else
    \begin{sjtu@bibliolist}{#1}{\sjtu@label@publications}
      \sjtu@publications@body
    \end{sjtu@bibliolist}
  \fi
}
\newcommand{\sjtu@@publications}[1]{\long\gdef\sjtu@@publications@body{#1}}
\NewDocumentEnvironment{publications*}{O{99}}{%
  \Collect@Body\sjtu@@publications
}{%
  \ifsjtu@review
    \begin{sjtu@bibliolist}{#1}{\sjtu@label@publications}
      \sjtu@@publications@body
    \end{sjtu@bibliolist}
  \fi
}
\newcommand{\sjtu@projects}[1]{\long\gdef\sjtu@projects@body{#1}}
\NewDocumentEnvironment{projects}{O{99}}{%
  \Collect@Body\sjtu@projects
}{%
  \ifsjtu@review\relax\else
    \begin{sjtu@bibliolist}{#1}{\sjtu@label@projects}
      \sjtu@projects@body
    \end{sjtu@bibliolist}
  \fi
}
\newcommand{\sjtu@@projects}[1]{\long\gdef\sjtu@@projects@body{#1}}
\NewDocumentEnvironment{projects*}{O{99}}{%
  \Collect@Body\sjtu@@projects
}{%
  \ifsjtu@review
    \begin{sjtu@bibliolist}{#1}{\sjtu@label@projects}
      \sjtu@@projects@body
    \end{sjtu@bibliolist}
  \fi
}
\newcommand{\sjtu@patents}[1]{\long\gdef\sjtu@patents@body{#1}}
\NewDocumentEnvironment{patents}{O{99}}{%
  \Collect@Body\sjtu@patents
}{%
  \ifsjtu@review\relax\else
    \begin{sjtu@bibliolist}{#1}{\sjtu@label@patents}
      \sjtu@patents@body
    \end{sjtu@bibliolist}
  \fi
}
\newcommand{\sjtu@@patents}[1]{\long\gdef\sjtu@@patents@body{#1}}
\NewDocumentEnvironment{patents*}{O{99}}{%
  \Collect@Body\sjtu@@patents
}{%
  \ifsjtu@review
    \begin{sjtu@bibliolist}{#1}{\sjtu@label@patents}
      \sjtu@@patents@body
    \end{sjtu@bibliolist}
  \fi
}
%    \end{macrocode}
%
% 定义简历环境。
%    \begin{macrocode}
\newcommand{\sjtu@resume}[1]{\long\gdef\sjtu@resume@body{#1}}
\NewDocumentEnvironment{resume}{}{%
  \Collect@Body\sjtu@resume
}{%
  \ifsjtu@review\relax\else
    \cleardoublepage
    \chapter{\sjtu@label@resume}
    \@mkboth{\sjtu@label@resume}%
            {\sjtu@label@resume}%
    \sjtu@resume@body
  \fi
}
%    \end{macrocode}
%
% \subsubsection{盲审模式}
%
% 盲审模式下隐藏作者、导师姓名等信息。同时将论文信息写入 PDF 元数据。
%    \begin{macrocode}
\AtBeginDocument{
  \ifsjtu@review%
    \sjtuSetInfo{%
      author={},
      supervisor={},
      assisupervisor={},
      enauthor={},
      ensupervisor={},
      enassisupervisor={},
      studentid={},
      date={},
      endate={}
    }
  \fi
  \hypersetup{%
    pdftitle    = \sjtu@value@title,
    pdfauthor   = \sjtu@value@author,
    pdfsubject  = \sjtu@label@subjectChi,
    pdfkeywords = \sjtu@value@keywords,
    pdfcreator  = {LaTeX with SJTUThesis \version}
  }%
}
%    \end{macrocode}
%
% \begin{macro}{\encrypt}
% 定义盲审模式工具宏\cs{encrypt}：
%    \begin{macrocode}
\NewDocumentCommand{\encrypt}{m O{***}}{%
  \ifsjtu@review
    {#2}
  \else
    {#1}
  \fi
}
%    \end{macrocode}
% \end{macro}
%
% \subsubsection{封面}
%
% 定义一个特殊的下划线命令供绘制本科论文封面时使用。
%    \begin{macrocode}
\newcommand{\sjtu@uline}[1]{%
  \begingroup
    \setbox0=\vbox{\strut #1\strut}%
    \dimen0=0pt
    \loop\ifdim\ht0>0pt
      \dimen1=\dimexpr\ht0 - \baselineskip\relax
      \setbox1=\vsplit0 to \ht\strutbox
      \advance\dimen1 by -\ht0
      \noindent\raisebox{-\dimen0}[\ht\strutbox][\dp\strutbox]{\box1}%
      \advance\dimen0 by \dimen1
      \vspace{-0.2ex}\hrule\vskip 0.2ex
    \repeat
  \endgroup
}
%</class>
%    \end{macrocode}
%
% 绘制封面
%    \begin{macrocode}
%<*(bachelor|graduate)>
\RenewDocumentCommand\maketitle{}{%
  \pdfbookmark[0]{\sjtu@label@titlepage}{titlepage}
  \sjtu@makechinesetitle%
%<graduate>  \sjtu@makeenglishtitle%
}
\newcommand{\sjtu@makechinesetitle}{%
  \cleardoublepage
%<*bachelor>
  \thispagestyle{empty}
  \begin{center}
    \kaishu
    \vspace*{48bp}
    \includegraphics{sjtu-name.pdf}
    \vskip 28bp
    {\fontsize{32}{32}\sjtu@label@subjectChi}
    \vskip 16bp
    {\zihao{-2}\MakeUppercase\sjtu@label@subjectEng}
    \vskip 16bp
    \includegraphics{sjtu-badge.pdf}
    \vskip \stretch{2}
    \begingroup
      \zihao{2}
      \begin{tabular}{r@{：}l}
        论文题目 &
        \begin{minipage}[t]{280pt}
          \zihao{-2}
          \begin{center}
            \sjtu@uline\sjtu@value@title
          \end{center}
        \end{minipage}
      \end{tabular}
    \endgroup
    \vskip \stretch{1}
    \begingroup
      \zihao{3}
      \def\arraystretch{1.1}
      \begin{tabular}
        {>{\begin{CJKfilltwosides}{4\ccwd}}r<{\end{CJKfilltwosides}}@{：}c}  
        \sjtu@label@authorChi        & \sjtu@value@author      \\ \cline{2-2}
        \sjtu@label@studentidChi     & \makebox[180pt]{\sjtu@value@studentid} \\
          \cline{2-2}
        \ifsjtu@course
          \sjtu@label@coursenameChi  & \sjtu@value@coursename  \\ \cline{2-2}
        \else
          \sjtu@label@majorChi       & \sjtu@value@major       \\ \cline{2-2}
        \fi
        \sjtu@label@supervisorChi    & \sjtu@value@supervisor  \\ \cline{2-2}
        \sjtu@label@departmentChi    & \sjtu@value@department  \\ \cline{2-2}
      \end{tabular}
    \endgroup
    \vskip 40bp
%</bachelor>
%<*graduate>
  \thispagestyle{sjtu@title}
  \begin{center}
    \vspace*{40bp}
    {\zihao{-2}\sjtu@label@subjectChi}
    \vskip \stretch{4}
    {\zihao{2}\heiti\sjtu@value@title \vskip 1bp}
    \vskip \stretch{5}
    \begingroup
      \zihao{4}
      \def\tabcolsep{1bp}
      \def\arraystretch{1.25}
      \begin{tabular}
        {>{\begin{CJKfilltwosides}[t]{6.5\ccwd}\heiti}r<{\end{CJKfilltwosides}}
          @{：}l}
        \sjtu@label@authorChi           & \sjtu@value@author         \\
        \sjtu@label@studentidChi        & \sjtu@value@studentid      \\
        \sjtu@label@supervisorChi       & \sjtu@value@supervisor     \\
        \ifx\sjtu@value@assisupervisor\@empty\else
          \sjtu@label@assisupervisorChi & \sjtu@value@assisupervisor \\
        \fi
        \sjtu@label@degreeChi           & \sjtu@value@degree         \\
        \sjtu@label@majorChi            & \sjtu@value@major          \\
        \sjtu@label@departmentChi       & \sjtu@value@department     \\
        \sjtu@label@defenddateChi       & \sjtu@value@date           \\
        \sjtu@label@conferringChi       & \sjtu@label@schoolChi      \\
      \end{tabular}
    \endgroup
    \vskip 26bp
%</graduate>
  \end{center}
  \cleardoublepage
}
%<*graduate>
\newcommand{\sjtu@makeenglishtitle}{%
  \cleardoublepage
  \thispagestyle{sjtu@entitle}
  \begin{center}
    \vspace*{28bp}
    {\zihao{-2}\sjtu@label@subjectEng \vskip 1bp}
    \vskip \stretch{4}
    {\zihao{2}\bfseries\MakeUppercase\sjtu@value@entitle \vskip 1bp}
    \vskip \stretch{5}
    \begingroup
      \zihao{4}
      \def\tabcolsep{1bp}
      \def\arraystretch{1.3}
      \begin{tabular}
        {>{\bfseries}l<{:~}l}
        \sjtu@label@authorEng           & \sjtu@value@enauthor         \\
        \sjtu@label@studentidEng        & \sjtu@value@studentid        \\
        \sjtu@label@supervisorEng       & \sjtu@value@ensupervisor     \\
        \ifx\sjtu@value@enassisupervisor\@empty\else
          \sjtu@label@assisupervisorEng & \sjtu@value@enassisupervisor \\
        \fi
        \sjtu@label@degreeEng           & \sjtu@value@endegree         \\
        \sjtu@label@majorEng            & \sjtu@value@enmajor          \\
        \sjtu@label@departmentEng       & \sjtu@value@endepartment     \\
        \sjtu@label@defenddateEng       & \sjtu@value@endate           \\
        \sjtu@label@conferringEng       & \sjtu@label@schoolEng        \\
      \end{tabular}
    \endgroup
    \vskip 26bp
  \end{center}
  \cleardoublepage
}
%</graduate>
%</(bachelor|graduate)>
%    \end{macrocode}
%
% \subsection{文档部件}
%
% \subsubsection{超链接}
%
%    \begin{macrocode}
%<*class>
\hypersetup{
  linktoc            = all,
  bookmarksnumbered  = true,
  bookmarksopen      = true,
  bookmarksopenlevel = 1,
  unicode            = true,
  psdextra           = true,
  breaklinks         = true,
  plainpages         = false,
  hidelinks,
}
\pdfstringdefDisableCommands{%
  \let\\\@empty
  \let\quad\@empty
  \let\hspace\@gobble
}
%    \end{macrocode}
%
% 设置 url 样式，与上下文一致。
%    \begin{macrocode}
\urlstyle{same}
%    \end{macrocode}
%
% 使用 \pkg{xurl} 的方法，增加 URL 可断行的位置。
%    \begin{macrocode}
\def\UrlBreaks{%
  \do\/%
  \do\a\do\b\do\c\do\d\do\e\do\f\do\g\do\h\do\i\do\j\do\k\do\l%
     \do\m\do\n\do\o\do\p\do\q\do\r\do\s\do\t\do\u\do\v\do\w\do\x\do\y\do\z%
  \do\A\do\B\do\C\do\D\do\E\do\F\do\G\do\H\do\I\do\J\do\K\do\L%
     \do\M\do\N\do\O\do\P\do\Q\do\R\do\S\do\T\do\U\do\V\do\W\do\X\do\Y\do\Z%
  \do0\do1\do2\do3\do4\do5\do6\do7\do8\do9\do=\do/\do.\do:%
  \do\*\do\-\do\~\do\'\do\"\do\-}
\Urlmuskip=0mu plus 0.1mu
%</class>
%    \end{macrocode}
%
% \subsection{其他宏包的设置}
%
% 这些宏包并非格式要求，但是为了方便同学们使用，在这里进行简单设置。
%    \begin{macrocode}
%<*class>
\newcommand{\sjtu@atendpackage}{\csname ctex_at_end_package:nn\endcsname}
%    \end{macrocode}
%
% \subsubsection{\pkg{unicode-math} 宏包}
%
%    \begin{macrocode}
\sjtu@atendpackage{unicode-math}{
  \unimathsetup{
    math-style = ISO,
    bold-style = ISO,
    nabla      = upright,
    partial    = upright,
  }
  \newcommand{\bm}{\symbf}
  \renewcommand{\boldsymbol}{\symbf}
  \newcommand{\square}{\mdlgwhtsquare}
  \@ifpackagelater{hyperref}{2019/04/27}{}{%
    \g@addto@macro\psdmapshortnames{\let\mu\textmugreek}%
  }
}
%    \end{macrocode}
%
% \subsubsection{\pkg{threeparttable} 宏包}
%
%    \begin{macrocode}
\sjtu@atendpackage{threeparttable}{
  \appto\TPTnoteSettings{\footnotesize}
}
%    \end{macrocode}
%
% \subsubsection{\pkg{siunitx} 宏包}
%
%    \begin{macrocode}
\sjtu@atendpackage{siunitx}{
  \sisetup{
    detect-all,
    group-minimum-digits = 4,
    separate-uncertainty = true,
    inter-unit-product   = \ensuremath{{}\cdot{}},
  }
  \ifsjtu@chinese
    \sisetup{
      list-final-separator = { 和 },
      list-pair-separator  = { 和 },
      range-phrase         = {～},
    }
  \fi
}
%    \end{macrocode}
%
% \subsubsection{\pkg{ntheorem} 宏包}
%
%    \begin{macrocode}
\PassOptionsToPackage{amsmath,thmmarks,hyperref}{ntheorem}
\sjtu@atendpackage{ntheorem}{
  \ifsjtu@chinese
    \def\sjtu@label@assertion{断言}
    \def\sjtu@label@assumption{假设}
    \def\sjtu@label@axiom{公理}
    \def\sjtu@label@corollary{推论}
    \def\sjtu@label@definition{定义}
    \def\sjtu@label@example{例}
    \def\sjtu@label@lemma{引理}
    \def\sjtu@label@proof{证明}
    \def\sjtu@label@proposition{命题}
    \def\sjtu@label@remark{注}
    \def\sjtu@label@theorem{定理}
  \else
    \def\sjtu@label@assertion{Assertion}
    \def\sjtu@label@assumption{Assumption}
    \def\sjtu@label@axiom{Axiom}
    \def\sjtu@label@corollary{Corollary}
    \def\sjtu@label@definition{Definition}
    \def\sjtu@label@example{Example}
    \def\sjtu@label@lemma{Lemma}
    \def\sjtu@label@proof{Proof}
    \def\sjtu@label@proposition{Proposition}
    \def\sjtu@label@remark{Remark}
    \def\sjtu@label@theorem{Theorem}
  \fi
  \theoremheaderfont{\bfseries\heiti}
  \theorembodyfont{\normalfont}
  \theoremseparator{}
  \theoremsymbol{\ensuremath{\square}}
  \newtheorem*{proof}{\sjtu@label@proof}
  \theoremstyle{plain}
  \theoremsymbol{}
  \newtheorem{theorem}             {\sjtu@label@theorem}    [chapter]
  \newtheorem{assertion}  [theorem]{\sjtu@label@assertion}
  \newtheorem{axiom}      [theorem]{\sjtu@label@axiom}
  \newtheorem{corollary}  [theorem]{\sjtu@label@corollary}
  \newtheorem{lemma}      [theorem]{\sjtu@label@lemma}
  \newtheorem{proposition}[theorem]{\sjtu@label@proposition}
  \newtheorem{assumption}          {\sjtu@label@assumption} [chapter]
  \newtheorem{definition}          {\sjtu@label@definition} [chapter]
  \newtheorem{example}             {\sjtu@label@example}    [chapter]
  \newtheorem*{remark}             {\sjtu@label@remark}
}
%    \end{macrocode}
%
% \subsubsection{\pkg{algorithm2e} 宏包}
%
%    \begin{macrocode}
\PassOptionsToPackage{algochapter}{algorithm2e}
\sjtu@atendpackage{algorithm2e}{
  \SetAlgorithmName{\sjtu@label@algorithm}%
                   {\sjtu@label@algorithm}%
                   {\sjtu@label@listalgorithm}
  \SetAlgoCaptionSeparator{~}
  \newcommand{\cftalgpresnum}{\sjtu@label@algorithm~}
  \AtEndPreamble{%
    \newlength{\cftalgindent}
      \setlength{\cftalgindent}{1.5em}
    \newlength{\cftalgnumwidth}
      \setlength{\cftalgnumwidth}{2.3em}
    \newlength{\sjtu@cftalgnumwidth@tmp}
      \settowidth{\sjtu@cftalgnumwidth@tmp}{\cftalgpresnum}
    \addtolength{\cftalgnumwidth}{\sjtu@cftalgnumwidth@tmp}
  }
  \renewcommand*{\l@algocf}{%
    \let\@cftbsnum \cftalgpresnum
    \@dottedtocline{1}{\cftalgindent}{\cftalgnumwidth}
  }
  \renewcommand{\listofalgorithms}{%
    \cleardoublepage%
    \pdfbookmark[0]{\listalgorithmcfname}{loa}%
    \chapter*{\listalgorithmcfname}%
    \@mkboth{\listalgorithmcfname}{\listalgorithmcfname}%
    \@starttoc{loa}
  }
  \AtBeginDocument{%
   \renewcommand{\thealgocf}{\thechapter--\@arabic\c@algocf}
  }
}
%    \end{macrocode}
%
% \subsubsection{\pkg{algorithm} 宏包}
%
%    \begin{macrocode}
\sjtu@atendpackage{algorithm}{
  \RequirePackage{algorithmicx, algpseudocode}
  \floatname{algorithm}{\sjtu@label@algorithm}
  \@addtoreset{algorithm}{chapter}
  \patchcmd\@chapter%
    {\if@twocolumn}
    {\addtocontents{loa}{\protect\addvspace{10\p@}}%
      \if@twocolumn}
    {}{}
  \renewcommand{\listalgorithmname}{\sjtu@label@listalgorithm}
  \newcommand{\cftalgpresnum}{\sjtu@label@algorithm~}
  \AtEndPreamble{%
    \newlength{\cftalgindent}
      \setlength{\cftalgindent}{1.5em}
    \newlength{\cftalgnumwidth}
      \setlength{\cftalgnumwidth}{2.3em}
    \newlength{\sjtu@cftalgnumwidth@tmp}
      \settowidth{\sjtu@cftalgnumwidth@tmp}{\cftalgpresnum}
    \addtolength{\cftalgnumwidth}{\sjtu@cftalgnumwidth@tmp}
  }
  \newcommand*{\l@algorithm}{%
    \let\@cftbsnum \cftalgpresnum
    \@dottedtocline{1}{\cftalgindent}{\cftalgnumwidth}
  }
  \renewcommand{\listofalgorithms}{%
    \cleardoublepage%
    \pdfbookmark[0]{\listalgorithmname}{loa}%
    \chapter*{\listalgorithmname}%
    \@mkboth{\listalgorithmname}{\listalgorithmname}%
    \@starttoc{loa}
  }
  \AtBeginDocument{%
    \renewcommand{\thealgorithm}{\thechapter--\arabic{algorithm}}
  }
}
%    \end{macrocode}
%
% \subsubsection{\pkg{listings} 宏包}
%
%    \begin{macrocode}
\sjtu@atendpackage{listings}{
  \lstdefinestyle{lstStyleCode}{
    aboveskip=\medskipamount,
    belowskip=\medskipamount,
    basicstyle=\footnotesize\ttfamily,
    commentstyle=\slshape\color{black!60},
    stringstyle=\color{green!40!black!100},
    keywordstyle=\bfseries\color{blue!50!black},
    extendedchars=false,
    upquote=true,
    tabsize=2,
    showstringspaces=false,
    xleftmargin=1em,
    xrightmargin=1em,
    breaklines=true,
    breakindent=2em,
    framexleftmargin=1em,
    framexrightmargin=1em,
    backgroundcolor=\color{gray!10},
    columns=flexible,
    keepspaces=true,
    texcl=true,
    mathescape=true
  }
  \lstnewenvironment{codeblock}[1][]
    {\lstset{style=lstStyleCode,#1}}{}
}
%    \end{macrocode}
%
% \subsubsection{\pkg{tikz} 宏包}
%
%    \begin{macrocode}
\sjtu@atendpackage{tikz}{
  \usetikzlibrary{shapes.geometric, arrows}
  \tikzstyle{startstop} = [
    rectangle,
    rounded corners,
    minimum width=2cm,
    minimum height=1cm,
    text centered,
    draw=black
  ]
  \tikzstyle{io} = [
    trapezium,
    trapezium left angle=75,
    trapezium right angle=105,
    minimum width=1cm,
    minimum height=1cm,
    text centered,
    draw=black
  ]
  \tikzstyle{process} = [
    rectangle,
    minimum width=2cm,
    minimum height=1cm,
    text centered,
    draw=black
  ]
  \tikzstyle{decision} = [
    diamond,
    minimum width=2cm,
    minimum height=1cm,
    text centered,
    draw=black]
  \tikzstyle{arrow} = [thick, ->, >=stealth]
}
%</class>
%    \end{macrocode}
%
% \iffalse
%    \begin{macrocode}
%<*document>
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{ltxdoc}}
\PassOptionsToClass{a4paper}{ltxdoc}
\ProcessOptions
\LoadClass{ltxdoc}
\RequirePackage{expl3}
\RequirePackage[UTF8, scheme=chinese]{ctex}
\RequirePackage{booktabs}
\RequirePackage{caption}
\RequirePackage{geometry}
\RequirePackage{graphicx}
\RequirePackage{hologo}
\RequirePackage{listings}
\RequirePackage{newpxtext}
\RequirePackage{newpxmath}
\RequirePackage{xcolor}
\RequirePackage{hypdoc}
\geometry{
  vmargin = 25mm,
  hmargin = {40mm, 20mm},
  headsep = 3mm
}
\ctexset{
  abstractname   = 简介,
}
\hypersetup{
  allcolors         = blue,
  bookmarksnumbered = true,
  bookmarksopen     = true,
}
\AtEndOfClass{\sloppy}
\definecolor{sjtublue}{cmyk}{1,0.8,0,0}
\lstdefinestyle{lstStyleBase}{
  basicstyle        = \footnotesize\ttfamily,
  commentstyle      = \slshape\color{black!60},
  stringstyle       = \color{green!40!black!100},
  keywordstyle      = \bfseries\color{blue!50!black},
  backgroundcolor   = \color{gray!10},
  gobble            = 2, % 重要！否则会生成注释符号"%"
  tabsize           = 2,
  xleftmargin       = 1em,
  xrightmargin      = 1em,
  framexleftmargin  = 1em,
  framexrightmargin = 1em
}
\lstdefinestyle{lstStyleShell}{
   style=lstStyleBase,
   language=bash
}
\lstdefinestyle{lstStyleLaTeX}{
   style=lstStyleBase,
   language=[LaTeX]TeX
}
\newcommand\shellcmd[1]{\colorbox{\color{gray!10}}{\lstinline[style=lstStyleShell]|#1|}}
\lstnewenvironment{shell}{\lstset{style=lstStyleShell}}{}
\lstnewenvironment{latex}{\lstset{style=lstStyleLaTeX}}{}
\newcommand{\note}[1]{{%
\color{magenta}{\noindent\bfseries 说明：}\emph{#1}}}
\def\TeX{\hologo{TeX}}
\def\TeXLive{\TeX\ Live}
\def\macTeX{Mac\TeX{}}
\def\LaTeX{\hologo{LaTeX}}
\def\BibLaTeX{\textsc{Bib}\LaTeX}
\def\CJKLaTeX{CJK--\LaTeX}
\def\XeTeX{\hologo{XeTeX}}
\def\XeLaTeX{\hologo{XeLaTeX}}
\DeclareRobustCommand\file{\nolinkurl}
\DeclareRobustCommand\env{\texttt}
\DeclareRobustCommand\pkg{\textsf}
\DeclareRobustCommand\cls{\textsf}
\DeclareRobustCommand\opt{\texttt}
\def\DescribeOption{\leavevmode\@bsphack\begingroup\MakePrivateLetters
  \Describe@Option}
\def\Describe@Option#1{\endgroup
  \marginpar{\raggedleft\PrintDescribeOption{#1}}%
  \SpecialEnvIndex{#1}\@esphack\ignorespaces}
\@ifundefined{PrintDescribeOption}
  {\def\PrintDescribeOption#1{\strut \MacroFont #1\ }}{}
\renewcommand\glossaryname{版本历史}
\GlossaryPrologue{\section*{\glossaryname}}
\ExplSyntaxOn
\DeclareDocumentCommand \StopSpecialIndexModule { }
  { \cs_set_eq:NN \__codedoc_special_index_module:nnnnN \use_none:nnnnn }
\cs_new_eq:NN \__sjtudoc_ltx_changes:nnn \changes@
\cs_set_protected:Npn \changes@ #1#2
  {
    \tl_if_empty:nTF {#1}
      { \__sjtudoc_ltx_changes:nnn }
      { \__sjtudoc_version_zfill:wnnn #1 \q_stop }
      {#1} {#2}
  }
\cs_new_protected:Npn \__sjtudoc_version_zfill:wnnn #1#2 \q_stop
  {
    \str_if_eq:nnTF {#1} { v }
      { \__sjtudoc_version_zfill:nnnn {#2} }
      { \__sjtudoc_ltx_changes:nnn }
  }
\cs_new_protected:Npn \__sjtudoc_version_zfill:nnnn #1#2
  {
    \tl_clear:N \l__sjtudoc_tmp_tl
    \int_zero:N \l_tmpa_int
    \seq_set_split:Nnn \l_tmpa_seq { . } {#1}
    \seq_map_function:NN \l_tmpa_seq \__sjtudoc_version_zfill:n
    \int_compare:nNnF \l_tmpa_int > 2
      {
        \tl_put_right:Nx \l__sjtudoc_tmp_tl
          { \prg_replicate:nn { 3 - \l_tmpa_int } { 00000 } }
      }
    \__sjtudoc_ltx_changes:nnn { \l__sjtudoc_tmp_tl \actualchar #2 }
  }
\tl_new:N \l__sjtudoc_tmp_tl
\cs_new_protected:Npn \__sjtudoc_version_zfill:n #1
  {
    \int_incr:N \l_tmpa_int
    \tl_put_right:Nx \l__sjtudoc_tmp_tl
      {
        \prg_replicate:nn
          { \int_max:nn { 0 } { 5 - \tl_count:n {#1} } } { 0 }
        \exp_not:n {#1}
      }
  }
\ExplSyntaxOff
\renewcommand\indexname{命令索引}
\IndexPrologue{%
  \section*{\indexname}
  \textit{意大利体的数字表示描述对应索引项的页码；%
    带下划线的数字表示定义对应索引项的代码行号；%
    罗马字体的数字表示使用对应索引项的代码行号。}%
}
%</document>
%    \end{macrocode}
% \fi
%
% \Finale
%
\endinput
